package jp.co.jolystar.product.activity;

import java.io.IOException;
import java.util.List;
import java.util.Locale;

import jp.co.jolystar.product.R;
import jp.co.jolystar.product.parts.PinItemizedOverlay;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.location.Address;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnKeyListener;
import android.view.Window;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.Toast;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;

public class TargetSettingActivity extends MapActivity implements
        LocationListener {
    /**
     * 現在地緯度
     */
    double doubleCurrentLatitude = -1.0;
    /**
     * 現在地経度
     */
    double doubleCurrentLongitude = -1.0;
    /**
     * 目的地緯度
     */
    double doubleTargetLatitude = -1.0;
    /**
     * 目的地経度
     */
    double doubleTargetLongitude = -1.0;
    /**
     * データの共有と保存
     */
    public SharedPreferences sharedPreferences;
    /**
     * マネージャー
     */
    LocationManager locationManager;
    /**
     * 目的地入力
     */
    EditText searchWord;
    /**
     * Button
     */
//    ImageButton searchButton;
    ImageButton histButton;
    ImageButton currentButton;

    /**
     * マップビュー
     */
    MapView mapView;
    /**
     * マップコントローラー
     */
    MapController mapController;
    /**
     * ログ出力用タグ
     */
    String tag = "TargetSettingActivity";
    /**
     * 定数
     */
    // 履歴保存件数
    final int HIST_NUM = 10;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.target_setting);

        // LocationManagerの取得
        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        // SharedPreferencesオブジェクトの取得
        sharedPreferences = getSharedPreferences("TargetCompass",
                Context.MODE_PRIVATE);

        searchWord = (EditText) findViewById(R.id.editText1);

//        searchButton = (ImageButton) findViewById(R.id.button_search);
        histButton = (ImageButton) findViewById(R.id.button_hist);
        currentButton = (ImageButton) findViewById(R.id.button_current);

        mapView = (MapView) findViewById(R.id.mapView);
        mapView.setBuiltInZoomControls(true);
        mapController = mapView.getController();
        // MapViewのOverlayを初期化する
        mapView.getOverlays().clear();
        // MapViewのデフォルトズームを15にセット
        mapController.setZoom(15);

        searchWord.setOnKeyListener(new OnKeyListener() {
            // EnterKey押した場合にソフトウェアキーボードを閉じる
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                // EnterKeyが押されたか判定
                if (event.getAction() == KeyEvent.ACTION_DOWN
                        && keyCode == KeyEvent.KEYCODE_ENTER) {
                    InputMethodManager imputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                    imputMethodManager.hideSoftInputFromWindow(
                            v.getWindowToken(), 0);
                    getTargetLocation();
                }
                return false;
            }
        });

        histButton.setOnClickListener(new OnClickListener() {
        	@Override
        	public void onClick(View v) {
                Intent intentTargetHistory = new Intent(TargetSettingActivity.this,
                        TargetHistoryActivity.class);
                startActivity(intentTargetHistory);
        	}
        });

        currentButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if (doubleCurrentLatitude > 0) {
                    mapController.animateTo(new GeoPoint((int) (doubleCurrentLatitude * 1e6),
                            (int) (doubleCurrentLongitude * 1e6)));
                }
            }
        });

        // 検索ボタン押下時処理
//        searchButton.setOnClickListener(new OnClickListener() {
//            @Override
//            public void onClick(View v) {
//                getTargetLocation(v);
//            }
//
//        });

    }

    /**
     * アクティビティがユーザとやり取りを開始する直前に実行
     */
    @Override
    public void onResume() {
        super.onResume();

        // GPSから現在地の情報を取得
        List<String> providers = locationManager.getProviders(true);
        for (String provider : providers) {
            locationManager.requestLocationUpdates(provider, 1000, 1, this);
        }

        // SharedPreferencesから目的地の座標を取得
        doubleTargetLatitude = Double.valueOf(
                sharedPreferences.getString("doubleTargetLatitude", "-1"))
                .doubleValue();
        doubleTargetLongitude = Double.valueOf(
                sharedPreferences.getString("doubleTargetLongitude", "-1"))
                .doubleValue();
        if (doubleTargetLongitude > 0) {
            drawPin(new GeoPoint((int) (doubleTargetLatitude * 1e6),
                    (int) (doubleTargetLongitude * 1e6)));
        }
        // テキストボックスに最新の地名をセットする
        searchWord.setText(sharedPreferences
                .getString("searchWordHistory0", ""));
        getTargetLocation();

    }

    /**
     * アクティビティがバックグラウンドに隠れる直前に実行
     */
    @Override
    public void onPause() {
        super.onPause();

        // SharedPreferencesへ目的地の座標を書き込む
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putString("doubleTargetLatitude",
                String.valueOf(doubleTargetLatitude));
        editor.putString("doubleTargetLongitude",
                String.valueOf(doubleTargetLongitude));
        editor.commit();

        // ロケーションリスナーを解除
        locationManager.removeUpdates(this);
    }

    /**
     * 目的地の緯度経度情報を取得
     *
     * @param v
     */
    private void getTargetLocation() {
        Geocoder geocoder = new Geocoder(TargetSettingActivity.this,
                Locale.getDefault());
        try {
            if (searchWord != null
                    && !"".equals(searchWord.getText().toString())) {
                List<Address> addressList = geocoder.getFromLocationName(
                        searchWord.getText().toString(), 1);
                if (addressList.size() > 0) {
                    // 目的地が取得できた場合
                    Address address = addressList.get(0);
                    doubleTargetLatitude = address.getLatitude();
                    doubleTargetLongitude = address.getLongitude();
                    GeoPoint targetGeoPoint = new GeoPoint((int) (doubleTargetLatitude * 1e6),
                            (int) (doubleTargetLongitude * 1e6));

//                    mapController.setZoom(15);
                    mapController.animateTo(targetGeoPoint);

                    drawPin(targetGeoPoint);
                    writeTarget(searchWord.getText().toString());
                } else {
                    // 目的地が取得できなかった場合
                    Toast.makeText(this, "目的地が存在しません。", Toast.LENGTH_SHORT)
                            .show();
                    doubleTargetLatitude = -1;
                    doubleTargetLongitude = -1;
                }
            } else {
                // 目的地が入力されなかった場合
                Toast.makeText(this, "目的地を入力してください。", Toast.LENGTH_SHORT)
                        .show();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * SharedPreferencesへ履歴として地名を書き込む
     *
     * @param target
     */
    private void writeTarget(String target) {
        int equalNum = HIST_NUM - 1;
        String[] searchWordHistory = new String[HIST_NUM];

        // SharedPreferencesから履歴地名を取り出す
        for (int i = 0; i < HIST_NUM; i++) {
            searchWordHistory[i] = sharedPreferences.getString(
                    "searchWordHistory" + i, "");
            // 今回書き込む地名が見つかればそこで終了する
            if (searchWordHistory[i].equals(target)) {
                equalNum = i;
                break;
            }
        }

        // 履歴の地名を古い方へ一つ下げてセットする
        for (int i = equalNum; i > 0; i--) {
            searchWordHistory[i] = searchWordHistory[i - 1];
        }
        // 今回の地名を最新にセットする
        searchWordHistory[0] = target;

        // SharedPreferencesへ地名を書き込む
        SharedPreferences.Editor editor = sharedPreferences.edit();
        for (int i = 0; i <= equalNum; i++) {
            editor.putString("searchWordHistory" + i, searchWordHistory[i]);
        }
        editor.commit();
    }

    /**
     * Mapにピン画像を描画するメソッド
     */
    public void drawPin(GeoPoint geoPoint) {
        Drawable pin = getResources().getDrawable(R.drawable.pin);
        PinItemizedOverlay pinOverlay = new PinItemizedOverlay(pin);
        removeOverlay(pin);
        mapView.getOverlays().add(pinOverlay);

        pinOverlay.addPoint(geoPoint);
    }

    @Override
    public void onLocationChanged(Location location) {
        // 緯度の取得
        doubleCurrentLatitude = location.getLatitude();
        // 経度の取得
        doubleCurrentLongitude = location.getLongitude();
        GeoPoint geoCurrentLocation = new GeoPoint((int) (doubleCurrentLatitude * 1e6),
                (int) (doubleCurrentLongitude * 1e6));

        // 現在地マーキング
        Drawable mark = getResources().getDrawable(R.drawable.mark);
        PinItemizedOverlay markOverlay = new PinItemizedOverlay(mark);
        removeOverlay(mark);
        mapView.getOverlays().add(markOverlay);

        markOverlay.addPoint(geoCurrentLocation);
    }

    private void removeOverlay(Drawable item) {
        Bitmap iBitmap = ((BitmapDrawable)item).getBitmap();
        Bitmap oBitmap = null;
        for (int i = 0; i < mapView.getOverlays().size(); i++) {
            oBitmap = ((BitmapDrawable)((PinItemizedOverlay)mapView.getOverlays().get(i)).getDrawable()).getBitmap();
            if (iBitmap == oBitmap) {
                mapView.getOverlays().remove(i);
            }
        }
    }

    @Override
    public void onStatusChanged(String s, int i, Bundle bundle) {
        // TODO 自動生成されたメソッド・スタブ

    }

    @Override
    public void onProviderEnabled(String s) {
        // TODO 自動生成されたメソッド・スタブ

    }

    @Override
    public void onProviderDisabled(String s) {
        // TODO 自動生成されたメソッド・スタブ

    }

    @Override
    protected boolean isRouteDisplayed() {
        // TODO 自動生成されたメソッド・スタブ
        return false;
    }
}